home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Utility Spectacular / Utilities / Calc / lib / regress.cal < prev    next >
Encoding:
Text File  |  1992-02-24  |  19.1 KB  |  650 lines  |  [TEXT/????]

  1. /*
  2.  * Copyright (c) 1992 David I. Bell
  3.  * Permission is granted to use, distribute, or modify this source,
  4.  * provided that this copyright notice remains intact.
  5.  *
  6.  * Test the correct execution of the calculator by reading this library file.
  7.  * Errors are reported with '****' messages, or worse.  :-)
  8.  *
  9.  * NOTE: Unlike most calc lib files, this one performs its work when
  10.  *       it is read.  Normally one would just define functions and
  11.  *     values for later use.  In the case of the regression test,
  12.  *     we do not want to do this.
  13.  */
  14.  
  15. define verify(test, str)
  16. {
  17.     if (test != 1) {
  18.         print '**** Non-true result (' : test : '): ' : str;
  19.         return;
  20.     }
  21.     print str;
  22. }
  23.  
  24.  
  25. define error(str)
  26. {
  27.     print '****' , str;
  28. }
  29.  
  30.  
  31. define getglobalvar()
  32. {
  33.     global    globalvar;
  34.  
  35.     return globalvar;
  36. }
  37.  
  38.  
  39. /*
  40.  * Test boolean operations and IF tests.
  41.  */
  42. define test_booleans()
  43. {
  44.     local    x;
  45.     local    y;
  46.     local    t1, t2, t3;
  47.  
  48.     print '100: Beginning test_booleans';
  49.  
  50.     if (0)
  51.         print '**** if (0)';
  52.  
  53.     if (1)
  54.         print '101: if (1)';
  55.  
  56.     if (2)
  57.         print '102: if (2)';
  58.  
  59.     if (1)
  60.         print '103: if (1) else';
  61.     else
  62.         print '**** if (1) else';
  63.  
  64.     if (0)
  65.         print '**** if (0) else';
  66.     else
  67.         print '104: if (0) else';
  68.  
  69.     if (1 == 1)
  70.         print '105: if 1 == 1';
  71.     else
  72.         print '**** if 1 == 1';
  73.  
  74.     if (1 != 2)
  75.         print '106: if 1 != 2';
  76.     else
  77.         print '**** if 1 != 2';
  78.  
  79.     verify(1,      '107: verify 1');
  80.     verify(2 == 2, '108: verify 2 == 2');
  81.     verify(2 != 3, '109: verify 2 != 3');
  82.     verify(2 <  3, '110: verify 2 <  3');
  83.     verify(2 <= 2, '111: verify 2 <= 2');
  84.     verify(2 <= 3, '112: verify 2 <= 3');
  85.     verify(3 >  2, '113: verify 3 >  2');
  86.     verify(2 >= 2, '114: verify 2 >= 2');
  87.     verify(3 >= 2, '115: verify 3 >= 2');
  88.     verify(!0,     '116: verify !0');
  89.     verify(!1 == 0,'117: verify !1 == 0');
  90.     print '118: Ending test_booleans';
  91. }
  92.  
  93.  
  94. /*
  95.  * Test variables and simple assignments.
  96.  */
  97. define test_variables()
  98. {
  99.     local    x1, x2, x3;
  100.     global    g1, g2;
  101.     local    t;
  102.     global    globalvar;
  103.  
  104.     print '200: Beginning test_variables';
  105.     x1 = 5;
  106.     x3 = 7 * 2;
  107.     x2 = 9 + 1;
  108.     globalvar = 22;
  109.     g1 = 19 - 3;
  110.     g2 = 79;
  111.     verify(x1 == 5,  '201: x1 == 5');
  112.     verify(x2 == 10, '202: x2 == 10');
  113.     verify(x3 == 14, '203: x3 == 14');
  114.     verify(g1 == 16, '204: g1 == 16');
  115.     verify(g2 == 79, '205: g2 == 79');
  116.     verify(globalvar == 22, '204: globalvar == 22');
  117.     verify(getglobalvar() == 22, '205: getglobalvar() == 22');
  118.     x1 = x2 + x3 + g1;
  119.     verify(x1 == 40, '206: x1 == 40');
  120.     g1 = x3 + g2;
  121.     verify(g1 == 93, '207: g1 == 207');
  122.     x1 = 5;
  123.     verify(x1++ == 5, '208: x1++ == 5');
  124.     verify(x1 == 6, '209: x1 == 6');
  125.     verify(++x1 == 7, '210: ++x1 == 7');
  126.     x1 += 3;
  127.     verify(x1 == 10, '211: x1 == 10');
  128.     x1 -= 6;
  129.     verify(x1 == 4, '212: x1 == 4');
  130.     x1 *= 3;
  131.     verify(x1 == 12, '213: x1 == 12');
  132.     x1 /= 4;
  133.     verify(x1 == 3, '214: x1 == 3');
  134.     x1 = x2 = x3;
  135.     verify(x2 == 14, '215: x2 == 14');
  136.     verify(x1 == 14, '216: x1 == 14');
  137.     print '217: Ending test_variables';
  138. }
  139.  
  140.  
  141. /*
  142.  * Test logical AND and OR operators and short-circuit evaluation.
  143.  */
  144. define test_logicals()
  145. {
  146.     local    x;
  147.  
  148.     print '300: Beginning test_logicals';
  149.  
  150.     if (2 && 3)
  151.         print '301: if (2 && 3)';
  152.     else
  153.         print '**** if (2 && 3)';
  154.  
  155.     if (2 && 0)
  156.         print '**** if (2 && 0)';
  157.     else
  158.         print '302: if (2 && 0)';
  159.  
  160.     if (0 && 2)
  161.         print '**** if (0 && 2)';
  162.     else
  163.         print '303: if (0 && 2)';
  164.  
  165.     if (0 && 0)
  166.         print '**** if (0 && 0)';
  167.     else
  168.         print '304: if (0 && 0)';
  169.  
  170.     if (2 || 0)
  171.         print '305: if (2 || 0)';
  172.     else
  173.         print '**** if (2 || 0)';
  174.  
  175.     if (0 || 2)
  176.         print '306: if (0 || 2)';
  177.     else
  178.         print '**** if (0 || 2)';
  179.  
  180.     if (0 || 0)
  181.         print '**** if (0 || 0)';
  182.     else
  183.         print '307: if (0 || 0)';
  184.  
  185.     x = 2 || 3; verify(x == 2, '308: (2 || 3) == 2');
  186.     x = 2 || 0; verify(x == 2, '309: (2 || 0) == 2');
  187.     x = 0 || 3; verify(x == 3, '310: (0 || 3) == 3');
  188.     x = 0 || 0; verify(x == 0, '311: (0 || 0) == 0');
  189.     x = 2 && 3; verify(x == 3, '312: (2 && 3) == 3');
  190.     x = 2 && 0; verify(x == 0, '313: (2 && 0) == 0');
  191.     x = 0 && 3; verify(x == 0, '314: (0 && 3) == 0');
  192.     x = 2 || error('2 || error()');
  193.     x = 0 && error('0 && error()');
  194.     print '315: Ending test_logicals';
  195. }
  196.  
  197.  
  198. /*
  199.  * Test simple arithmetic operations and expressions.
  200.  */
  201. define test_arithmetic()
  202. {
  203.     print '400: Beginning test_arithmetic';
  204.     verify(3+4==7, '401: 3 + 4 == 7');
  205.     verify(4-1==3, '402: 4 - 1 == 3');
  206.     verify(2*3==6, '403: 2 * 3 == 6');
  207.     verify(8/4==2, '404: 8 / 4 == 2');
  208.     verify(2^3==8, '405: 2 ^ 3 == 8');
  209.     verify(9-4-2==3, '406: 9-4-2 == 3');
  210.     verify(9-4+2==7, '407: 9-4+2 == 6');
  211.     verify(-5+2==-3,  '408: -5+2 == -3');
  212.     verify(2*3+1==7, '409: 2*3+1 == 7');
  213.     verify(1+2*3==7, '410: 1+2*3 == 7');
  214.     verify((1+2)*3==9, '411: (1+2)*3 == 9');
  215.     verify(2*(3+1)==8, '412: 2*(3+1) == 8');
  216.     verify(9-(2+3)==4, '413: 9-(2+3) == 4');
  217.     verify(9+(2-3)==8, '414: 9+(2-3) == 8');
  218.     verify((2+3)*(4+5)==45, '415: (2+3)*(4+5) == 45');
  219.     verify(10/(2+3)==2, '416: 10/(2+3) == 2');
  220.     verify(12/3+4==8, '417: 12/3+4 == 8');
  221.     verify(6+12/3==10, '418: 6+12/3 == 10');
  222.     verify(2+3==1+4, '419: 2+3 == 1+4');
  223.     verify(-(2+3)==-5, '420: -(2+3) == -5');
  224.     verify(7&18==2,    '421: 7&18 == 2');
  225.     verify(3|17==19,   '422: 3|17 == 19');
  226.     verify(2&3|1==3,   '423: 2&3|1 == 3');
  227.     verify(2&(3|1)==2, '424: 2&(3|1) == 2');
  228.     verify(3<<4==48,   '425: 3<<4 == 48');
  229.     verify(5>>1==2,    '426: 5>>1 == 2');
  230.     verify(3<<-1==1,   '427: 3<<-1 == 1');
  231.     verify(5>>-2==20,  '428: 5>>-2 == 20');
  232.     verify(1<<2<<3==65536, '429: 1<<2<<3 == 65536');
  233.     verify((1<<2)<<3==32, '430: (1<<2)<<3 == 32');
  234.     verify(2^3^2==512, '431: 2^3^2 == 512');
  235.     verify((2^3)^2==64,'432: (2^3)^2 == 64');
  236.     print '433: Ending test_arithmetic';
  237. }
  238.  
  239.  
  240. /*
  241.  * Test string constants and comparisons
  242.  */
  243. define test_strings()
  244. {
  245.     local x, y, z;
  246.  
  247.     print '500: Beginning test_strings';
  248.     x = 'string';
  249.     y = "string";
  250.     z = x;
  251.     verify(z == "string", '501: z == "string"');
  252.     verify(z != "foo", '502: z != "foo"');
  253.     verify(z != 3, '503: z != 3');
  254.     verify('' == "", '504: \'\' == ""');
  255.     verify("a" == "a", '505: "a" == "a"');
  256.     verify("c" != "d", '506: "c" != "d"');
  257.     verify("" != "a", '507: "" != "a"');
  258.     verify("rs" < "rt", '508: "rs" < "rt"');
  259.     verify("rs" < "ss", '509: "rs < "ss"');
  260.     verify("rs" <= "rs", '510: "rs" <= "rs"');
  261.     verify("rs" <= "tu", '511: "rs" <= "tu"');
  262.     verify("rs" > "cd", '512: "rs" > "cd"');
  263.     verify("rs" >= "rs", '513: "rs" >= "rs"');
  264.     verify("rs" >= "cd", '514: "rs" >= "cd"'); 
  265.     verify("abc" > "ab", '515: "abc" > "ab"');
  266.     print '516: Ending test_strings';
  267. }
  268.  
  269.  
  270. /*
  271.  * Do multiplication and division on three numbers in various ways
  272.  * and verify the results agree.
  273.  */
  274. define muldivcheck(a, b, c, str)
  275. {
  276.     local    abc, acb, bac, bca, cab, cba;
  277.  
  278.     abc = (a * b) * c;
  279.     acb = (a * c) * b;
  280.     bac = (b * a) * c;
  281.     bca = (b * c) * a;
  282.     cab = (c * a) * b;
  283.     cba = (c * b) * a;
  284.  
  285.     if (abc != acb) print '**** abc != acb:', str;
  286.     if (acb != bac) print '**** acb != bac:', str;
  287.     if (bac != bca) print '**** bac != bca:', str;
  288.     if (bca != cab) print '**** bca != cab:', str;
  289.     if (cab != cba) print '**** cab != cba:', str;
  290.     if (abc/a != b*c) print '**** abc/a != bc:', str;
  291.     if (abc/b != a*c) print '**** abc/b != ac:', str;
  292.     if (abc/c != a*b) print '**** abc/c != ab:', str;
  293.     print str;
  294. }
  295.  
  296.  
  297. /*
  298.  * Use the identity for squaring the sum of two squares to check
  299.  * multiplication and squaring.
  300.  */
  301. define squarecheck(a, b, str)
  302. {
  303.     local    a2, b2, tab, apb, apb2, t;
  304.  
  305.     a2 = a^2;
  306.     b2 = b^2;
  307.     tab = a * b * 2;
  308.     apb = a + b;
  309.     apb2 = apb^2;
  310.     if (a2 != a*a) print '**** a^2 != a*a:', str;
  311.     if (b2 != b*b) print '**** b^2 != b*b:', str;
  312.     if (apb2 != apb*apb) print '**** (a+b)^2 != (a+b)*(a+b):', str;
  313.     if (a2+tab+b2 != apb2) print '**** (a+b)^2 != a^2 + 2ab + b^2:', str;
  314.     if (a2/a != a) print '**** a^2/a != a:', str;
  315.     if (b2/b != b) print '**** b^2/b != b:', str;
  316.     if (apb2/apb != apb) print '**** (a+b)^2/(a+b) != a+b:', str;
  317.     if (a2*b2 != (a*b)^2) print '**** a^2*b^2 != (ab)^2:', str;
  318.     print str;
  319. }
  320.  
  321.  
  322. /*
  323.  * Use the raising of numbers to large powers to check multiplication
  324.  * and exponentiation.
  325.  */
  326. define powercheck(a, p1, p2, str)
  327. {
  328.     local    a1, a2, a3;
  329.  
  330.     a1 = (a^p1)^p2;
  331.     a2 = (a^p2)^p1;
  332.     a3 = a^(p1*p2);
  333.     if (a1 != a2) print '**** (a^p1)^p2 != (a^p2)^p1:', str;
  334.     if (a1 != a3) print '**** (a^p1)^p2 != a^(p1*p2):', str;
  335.     print str;
  336. }
  337.  
  338.  
  339. /*
  340.  * Test fraction reductions.
  341.  * Arguments MUST be relatively prime.
  342.  */
  343. define fraccheck(a, b, c, str)
  344. {
  345.     local    ab, bc, ca, aoc, boc, aob;
  346.  
  347.     ab = a * b;
  348.     bc = b * c;
  349.     ca = c * a;
  350.     aoc = ab / bc;
  351.     if (num(aoc) != a) print '**** num(aoc) != a:', str;
  352.     if (den(aoc) != c) print '**** den(aoc) != c:', str;
  353.     boc = ab / ca;
  354.     if (num(boc) != b) print '**** num(boc) != b:', str;
  355.     if (den(boc) != c) print '**** den(boc) != c:', str;
  356.     aob = ca / bc;
  357.     if (num(aob) != a) print '**** num(aob) != a:', str;
  358.     if (den(aob) != b) print '**** den(aob) != b:', str;
  359.     if (aob*boc != aoc) print '**** aob*boc != aoc;', str;
  360.     print str;
  361. }
  362.  
  363.  
  364. /*
  365.  * Test multiplication and squaring algorithms.
  366.  */
  367. define algcheck(a, b, str)
  368. {
  369.     local    ss, ms, t1, t2, t3, t4, t5, t6, t7;
  370.     local    a1, a2, a3, a4, a5, a6, a7;
  371.     local    oldmul2, oldsq2;
  372.  
  373.     oldmul2 = config("mul2", 2);
  374.     oldsq2 = config("sq2", 2);
  375.     a1 = a * b;
  376.     a2 = a * a;
  377.     a3 = b * b;
  378.     a4 = a^2;
  379.     a5 = b^2;
  380.     a6 = a2^2;
  381.     a7 = pmod(3,a-1,a);
  382.     for (ms = 2; ms < 20; ms++) {
  383.         for (ss = 2; ss < 20; ss++) {
  384.             config("mul2", ms);
  385.             config("sq2", ss);
  386.             t1 = a * b;
  387.             t2 = a * a;
  388.             t3 = b * b;
  389.             t4 = a^2;
  390.             t5 = b^2;
  391.             t6 = t2^2;
  392.             if (((ms + ss) % 37) == 4)
  393.                 t7 = pmod(3,a-1,a);
  394.             if (t1 != a1) print '**** t1 != a1:', str;
  395.             if (t2 != a2) print '**** t2 != a2:', str;
  396.             if (t3 != a3) print '**** t3 != a3:', str;
  397.             if (t4 != a4) print '**** t4 != a4:', str;
  398.             if (t5 != a5) print '**** t5 != a5:', str;
  399.             if (t6 != a6) print '**** t6 != a6:', str;
  400.             if (t7 != a7) print '**** t7 != a7:', str;
  401.         }
  402.     }
  403.     config("mul2", oldmul2);
  404.     config("sq2", oldsq2);
  405.     print str;
  406. }
  407.  
  408.  
  409. /*
  410.  * Test big numbers using some identities.
  411.  */
  412. define test_bignums()
  413. {
  414.     local    a, b, c, d;
  415.  
  416.     print '600: Beginning test_bignums';
  417.     a = 64357824568234938591;
  418.     b = 12764632632458756817;
  419.     c = 43578234973856347982;
  420.     muldivcheck(a, b, c, '601: muldivcheck 1');
  421.     a = 3^100;
  422.     b = 5^97;
  423.     c = 7^88;
  424.     muldivcheck(a, b, c, '602: muldivcheck 2');
  425.     a = 2^160 - 1;
  426.     b = 2^161 - 1;
  427.     c = 2^162 - 1;
  428.     muldivcheck(a, b, c, '603: muldivcheck 3');
  429.     a = 3^35 / 5^35;
  430.     b = 7^35 / 11^35;
  431.     c = 13^35 / 17^35;
  432.     muldivcheck(a, b, c, '604: muldivcheck 4');
  433.     a = (10^97-1) / 9;
  434.     b = (10^53-1) / 9;
  435.     c = (10^37-1) / 9;
  436.     muldivcheck(a, b, c, '605: muldivcheck 5');
  437.     a = 17^50;
  438.     b = 19^47;
  439.     squarecheck(a, b, '606: squarecheck 1');
  440.     a = 2^111-1;
  441.     b = 2^17;
  442.     squarecheck(a, b, '607: squarecheck 2');
  443.     a = 23^43 / 29^43;
  444.     b = 31^42 / 37^29;
  445.     squarecheck(a, b, '608: squarecheck 3');
  446.     a = 4657892345743659834657238947854639;
  447.     b = 43784356784365893467659347867689;
  448.     squarecheck(a, b, '609: squarecheck 4');
  449.     a = (10^80-1) / 9;
  450.     b = (10^50-1) / 9;
  451.     squarecheck(a, b, '610: squarecheck 5');
  452.     a = 101^99;
  453.     b = -a;
  454.     squarecheck(a, b, '611: squarecheck 6');
  455.     a = (10^19-1) / 9;
  456.     verify(ptest(a, 20), '612: primetest R19');
  457.     a = (10^23-1) / 9;
  458.     verify(ptest(a, 20), '613: primetest R23');
  459.     a = 2^127 - 1;
  460.     verify(ptest(a, 1), '614: primetest M127');
  461.     a = 2^521 - 1;
  462.     verify(ptest(a, 1), '615: primetest M521');
  463.     powercheck(17, 127, 30, '616: powercheck 1');
  464.     powercheck(111, 899, 6, '617: powercheck 2');
  465.     powercheck(3, 87, 89, '618: powercheck 3');
  466.     fraccheck(3^200, 5^173, 7^138, '619: fraccheck 1');
  467.     fraccheck(11^100, 12^98, 13^121, '620: fraccheck 2');
  468.     fraccheck(101^270, 103^111, 105^200, '621: fraccheck 3');
  469.     a = 0xffff0000ffffffff00000000ffff0000000000000000ffff;
  470.     b = 0x555544440000000000000000000000000000000011112222333344440000;
  471.     c = 0x999911113333000011111111000022220000000000000000333300000000ffff;
  472.     d = 0x3333ffffffff0000000000000000ffffffffffffffff000000000000;
  473.     algcheck(a, a, '622: algcheck 1');
  474.     algcheck(a, b, '623: algcheck 2');
  475.     algcheck(a, c, '624: algcheck 3');
  476.     algcheck(a, d, '625: algcheck 4');
  477.     algcheck(b, b, '626: algcheck 5');
  478.     algcheck(b, c, '627: algcheck 6');
  479.     algcheck(b, d, '628: algcheck 7');
  480.     algcheck(c, c, '629: algcheck 8');
  481.     algcheck(c, d, '630: algcheck 9');
  482.     algcheck(d, d, '631: algcheck 10');
  483.     print '632: Ending test_bignums';
  484. }
  485.  
  486.  
  487. /*
  488.  * Test many of the built-in functions.
  489.  */
  490. define test_functions()
  491. {
  492.     print '700: Beginning test_functions';
  493.     verify(abs(3) == 3,    '701: abs(3) == 3');
  494.     verify(abs(-4) == 4,   '702: abs(-4) == 4');
  495.     verify(avg(7) == 7,    '703: avg(7) == 7');
  496.     verify(avg(3,5) == 4,  '704: avg(3,5) == 4');
  497.     verify(cmp(2,3) == -1, '705: cmp(2,3) == -1');
  498.     verify(cmp(6,6) == 0,  '706: cmp(6,6) == 0');
  499.     verify(cmp(7,4) == 1,  '707: cmp(7,4) == 1');
  500.     verify(comb(9,9) == 1, '708: comb(9,9) == 1');
  501.     verify(comb(5,2) == 10,'709: comb(5,2) == 10');
  502.     verify(conj(4) == 4,   '710: conj(4) == 4');
  503.     verify(conj(2-3i) == 2+3i, '711: conj(2-3i) == 2+3i');
  504.     verify(den(17) == 1,   '712: den(17) == 1');
  505.     verify(den(3/7) == 7,  '713: den(3/7) == 7');
  506.     verify(den(-2/3) == 3, '714: den(-2/3) == 3');
  507.     verify(digits(0) == 1, '715: digits(0) == 1');
  508.     verify(digits(9) == 1, '716: digits(9) == 1');
  509.     verify(digits(10) == 2,'717: digits(10) == 2');
  510.     verify(digits(-691) == 3, '718: digits(-691) == 3');
  511.     verify(eval('2+3') == 5, "719: eval('2+3') == 5");
  512.     verify(fcnt(11,3) == 0,'720: fcnt(11,3) == 0');
  513.     verify(fcnt(18,3) == 2,'721: fcnt(18,3) == 2');
  514.     verify(fib(0) == 0,    '722: fib(0) == 0');
  515.     verify(fib(1) == 1,    '723: fib(1) == 1');
  516.     verify(fib(9) == 34,   '724: fib(9) == 34');
  517.     verify(frem(12,5) == 12, '725: frem(12,5) == 12');
  518.     verify(frem(45,3) == 5, '726: frem(45,3) == 5');
  519.     verify(fact(0) == 1,   '727: fact(0) == 1');
  520.     verify(fact(1) == 1,   '728: fact(1) == 1');
  521.     verify(fact(5) == 120, '729: fact(5) == 120');
  522.     verify(frac(3) == 0,   '730: frac(3) == 0');
  523.     verify(frac(2/3) == 2/3, '731: frac(2/3) == 2/3');
  524.     verify(frac(17/3) == 2/3, '732: frac(17/3) == 2/3');
  525.     verify(gcd(0,3) == 3,  '733: gcd(0,3) == 3');
  526.     verify(gcd(1,12) == 1, '734: gcd(1,12) == 1');
  527.     verify(gcd(11,7) == 1, '735: gcd(11,7) == 1');
  528.     verify(gcd(20,65) == 5, '736: gcd(20,65) == 5');
  529.     verify(gcdrem(20,3) == 20, '737: gcdrem(20,3) == 20');
  530.     verify(gcdrem(100,6) == 25, '738: gcdrem(100,6) == 25');
  531.     verify(highbit(1) == 0, '739: highbit(1) == 0');
  532.     verify(highbit(15) == 3, '740: highbit(15) == 3');
  533.     verify(hypot(3,4) == 5, '741: hypot(3,4) == 5');
  534.     verify(ilog(90,3) == 4, '742: ilog(90,3) == 4');
  535.     verify(ilog10(123) == 2, '743: ilog10(123) == 2');
  536.     verify(ilog2(17) == 4, '744: ilog2(17) == 4');
  537.     verify(im(3) == 0,     '745: im(3) == 0');
  538.     verify(im(2+3i) == 3,  '746: im(2+3i) == 3');
  539.     verify(int(5) == 5,    '757: int(5) == 5');
  540.     verify(int(19/3) == 6, '758: int(19/3) == 6');
  541.     verify(inverse(3/2) == 2/3, '759: inverse(3/2) == 2/3');
  542.     verify(iroot(18,2) == 4, '760: iroot(18,2) == 4');
  543.     verify(iroot(100,3) == 4, '761: iroot(100,3) == 4');
  544.     verify(iseven(10) == 1, '762: iseven(10) == 1');
  545.     verify(iseven(13) == 0, '763: iseven(13) == 0');
  546.     verify(iseven('a') == 0, "764: iseven('a') == 0");
  547.     verify(isint(7) == 1,  '765: isint(7) == 1');
  548.     verify(isint(19/2) == 0, '766: isint(19/2) == 0');
  549.     verify(isint('a') == 0, "767: isint('a') == 0");
  550.     verify(islist(3) == 0, '768: islist(3) == 0');
  551.     verify(islist(list(2,3)) == 1, '769: islist(list(2,3)) == 1');
  552.     verify(ismat(3) == 0, '770: ismat(3) == 0');
  553.     verify(ismult(7,3) == 0, '771: ismult(7,3) == 0');
  554.     verify(ismult(15,5) == 1, '772: ismult(15,5) == 1');
  555.     verify(isnull(3) == 0, '773: isnull(3) == 0');
  556.     verify(isnull(null()) == 1, '774: isnull(null()) == 1');
  557.     verify(isnum(2/3) == 1, '775: isnum(2/3) == 1');
  558.     verify(isnum('xx') == 0, "776: isnum('xx') == 0");
  559.     verify(isobj(3) == 0, '777: isobj(3) == 0');
  560.     verify(isodd(7) == 1, '778: isodd(7) == 1');
  561.     verify(isodd(8) == 0, '779: isodd(8) == 0');
  562.     verify(isodd('x') == 0, "780: isodd('a') == 0");
  563.     verify(isqrt(27) == 5, '781: isqrt(27) == 5');
  564.     verify(isreal(3) == 1, '782: isreal(3) == 1');
  565.     verify(isreal('x') == 0, "783: isreal('x') == 0");
  566.     verify(isreal(2+3i) == 0, '784: isreal(2+3i) == 0');
  567.     verify(isstr(5) == 0,  '785: isstr(5) == 0');
  568.     verify(isstr('foo') == 1, "786: isstr('foo') == 1");
  569.     verify(isrel(10,14) == 0, '787: isrel(10,14) == 0');
  570.     verify(isrel(15,22) == 1, '788: isrel(15,22) == 1');
  571.     verify(issimple(6) == 1, '789: issimple(6) == 1');
  572.     verify(issimple(3-2i) == 1, '790: issimple(3-2i) == 1');
  573.     verify(issimple(list(5)) == 0, '791: issimple(list(5)) == 0');
  574.     verify(issq(26) == 0, '792: issq(26) == 0');
  575.     verify(issq(9/4) == 1, '793: issq(9/4) == 1');
  576.     verify(istype(9,4) == 1, '795: istype(9,4) == 1');
  577.     verify(istype(3,'xx') == 0, "796: istype(3,'xx') == 0");
  578.     verify(jacobi(5,11) == 1, '797: jacobi(2,7) == 1');
  579.     verify(jacobi(6,13) == -1, '798: jacobi(6,13) == 0');
  580.     verify(lcm(3,4,5,6) == 60, '799: lcm(3,4,5,6) == 60');
  581.     verify(lcmfact(8) == 840, '800: lcmfact(8) == 840');
  582.     verify(lfactor(21,5) == 3, '801: lfactor(21,5) == 3');
  583.     verify(lfactor(97,20) == 1, '802: lfactor(97,20) == 1');
  584.     verify(lowbit(12) == 2, '803: lowbit(12) == 2');
  585.     verify(lowbit(17) == 0, '804: lowbit(17) == 0');
  586.     verify(ltol(1) == 0, '805: ltol(1) == 0');
  587.     verify(max(3,-9,7,4) == 7, '806: max(3,-9,7,4) == 7');
  588.     verify(meq(13,33,10) == 1, '807: meq(13,33,10) == 1');
  589.     verify(meq(7,19,11) == 0, '808: meq(7,19,11) == 0');
  590.     verify(min(9,5,12) == 5, '809: min(9,5,12) == 5');
  591.     verify(minv(13,97) == 15, '810: minv(13,97) == 15');
  592.     verify(mne(16,37,10) == 1, '811: mne(16,37,10) == 1');
  593.     verify(mne(46,79,11) == 0, '812: mne(46,79,11) == 0');
  594.     verify(norm(4) == 16,   '813: norm(4) == 16');
  595.     verify(norm(2-3i) == 13, '814: norm(2-3i) == 13');
  596.     verify(num(7) == 7,     '815: num(7) == 7');
  597.     verify(num(11/4) == 11, '816: num(11/4) == 11');
  598.     verify(num(-9/5) == -9, '817: num(-9/5) == -9');
  599.     verify(char(ord('a')+2) == 'c', "818: char(ord('a')+2) == 'c'");
  600.     verify(perm(7,3) == 210, '819: perm(7,3) == 210');
  601.     verify(pfact(10) == 210, '820: pfact(10) == 210');
  602.     verify(places(3/7) == -1, '821: places(3/7) == -1');
  603.     verify(places(.347) == 3, '822: places(.347) == 3');
  604.     verify(places(17) == 0, '823: places(17) == 0');
  605.     verify(pmod(3,36,37) == 1, '824: pmod(3,36,37) == 1');
  606.     verify(poly(2,3,5,2) == 19, '825; poly(2,3,5,2) == 19');
  607.     verify(ptest(101,10) == 1, '826: ptest(101,10) == 1');
  608.     verify(ptest(221,30) == 0, '827: ptest(221,30) == 0');
  609.     verify(re(9) == 9,       '828: re(9) == 9');
  610.     verify(re(-7+3i) == -7,  '829: re(-7+3i) == -7');
  611.     verify(scale(3,4) == 48, '830: scale(3,4) == 48');
  612.     verify(sgn(-4) == -1,    '831: sgn(-4) == -1');
  613.     verify(sgn(0) == 0,      '832: sgn(0) == 0');
  614.     verify(sgn(3) == 1,      '833: sgn(3) == 1');
  615.     verify(size(7) == 1,     '834: size(7) == 1');
  616.     verify(sqrt(121) == 11,  '835: sqrt(121) == 11');
  617.     verify(ssq(2,3,4) == 29, '836: ssq(2,3,4) == 29');
  618.     verify(str(45) == '45',  "837; str(45) == '45'");
  619.     verify(strcat('a','bc','def')=='abcdef',"838; strcat('a','bc','def')=='abcdef'");
  620.     verify(strlen('') == 0,  "839: strlen('') == 0");
  621.     verify(strlen('abcd') == 4, "840: strlen('abcd') == 4");
  622.     verify(substr('abcd',2,1) == 'b', "841: substr('abcd',2,1) == 'b'");
  623.     verify(substr('abcd',3,4) == 'cd', "842: substr('abcd',3,4) == 'cd'");
  624.     verify(substr('abcd',1,3) == 'abc', "843: substr('abcd',1,3) == 'abc'");
  625.     verify(xor(17,17) == 0,  '844: xor(17,17) == 0');
  626.     verify(xor(12,5) == 9,   '845: xor(12,5) == 9');
  627.     verify(mmin(3,7) == 3, '846: mmin(3,7) == 3');
  628.     verify(mmin(4,7) == -3, '847: mmin(4,7) == -3');
  629.     verify(digit(123,2) == 1, '848: digit(123,2) == 1');
  630.     print '849: Ending test_functions';
  631. }
  632.  
  633.  
  634. print '001: Beginning regression tests';
  635. print '002: Within each section, output should be numbered sequentially';
  636. print;
  637. return test_booleans();
  638. print;
  639. return test_variables();
  640. print;
  641. return test_logicals();
  642. print;
  643. return test_arithmetic();
  644. print;
  645. return test_strings();
  646. print;
  647. return test_bignums();
  648. print;
  649. return test_functions();
  650.